package Server;

/*
 * File:    PanelInformacion.java
 * Coms:    Implementa la gestión de la informacion que se muestra del sistema
 */

/**
 * @author Daniel Cabrera Ebana - 686013
 * @author Alberto Sanchez Romero - 662385
 * @since 
 */

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

public class PanelInformacion implements Runnable, ActionListener {
	static JFrame frame;
	String[] strings = { "Hora del sistema", // 1
			"En Valla 1",// 3
			"En cola Valla1 ",// 5
			"Hora fin Valla 1 ", // 7
			"En Valla 2", // 9
			"En cola Valla 2", // 11
			"Hora fin Valla 2", // 13
			"Clientes negociando", // 15
			"Apagar" }; // 17
	int j = 0;
	static JLabel[] labels = new JLabel[17];
	static Container content;

	private GestorRecursos monitorRecursos;
	private JButton button1;
	boolean continuar = true;
	int tiempo = 0;

	public PanelInformacion(GestorRecursos gr) {

		monitorRecursos = gr;
		frame = new JFrame("Informacion del sistema");
		// JFrame frame = new JFrame("Informacion del Sistema");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		int row = 9;
		int col = 2;
		content = frame.getContentPane();
		content.setLayout(new GridLayout(row, col));
		Border border = LineBorder.createGrayLineBorder();

		for (int i = 0; i < labels.length; i++) {

			if (i % 2 == 0) {
				if (strings[j].equals("Apagar")) {
					this.button1 = new JButton("Apagar");
					this.button1.addActionListener(this);
					content.add(button1);
				} else {
					labels[i] = new JLabel(strings[j], JLabel.CENTER);
					labels[i].setBorder(border);
					content.add(labels[i]);
					j++;
				}
			} else if (i % 2 != 0) {
				labels[i] = new JLabel(Integer.toString(0));
				labels[i].setBorder(border);
				content.add(labels[i]);
			}

		}

		// frame.setSize(300, 400);
		frame.pack();
		frame.setVisible(true);
		frame.setResizable(false);

		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

	public void actionPerformed(ActionEvent e) {
		// if (e.getActionCommand().equals("Button1"))
		if (e.getSource() == button1)
			;
		System.out.println("Boton apagado pulsado");
		//Pone a true el estado de apagar
		monitorRecursos.setApagar();

	}

	public void run() {

		while (true) {

			infoHora(getHoraActual());

			infoEnValla1(monitorRecursos.getImgEnValla(1));//
			infoEnColaValla1(monitorRecursos.getsize(1));

			// este es el tiempo estimado que se debe devolver al cliente
			tiempo = monitorRecursos.getTiempoValla(1)
					+ monitorRecursos.tiempoEnCola(1);
			infoTiempoColaV1(formateoFecha(anadirTiempo(getHoraActual(), tiempo)));

			infoEnValla2(monitorRecursos.getImgEnValla(2));//
			infoEnColaValla2(monitorRecursos.getsize(2));
			
			tiempo = monitorRecursos.getTiempoValla(2)
					+ monitorRecursos.tiempoEnCola(12);
			infoTiempoColaV2(formateoFecha(anadirTiempo(getHoraActual(), tiempo)));

			getClientes(monitorRecursos.getNumClientes());

			// Actualizar los tiempos de las imgaenes que estan en la valla

			if (monitorRecursos.getTiempoValla(1) > 0) {
				monitorRecursos.updateTimeOnValla(1);
			}
			if (monitorRecursos.getTiempoValla(2) > 0) {
				monitorRecursos.updateTimeOnValla(2);
			}

			if (monitorRecursos.tiempoEnCola(1) > 0) {
				monitorRecursos.updateTimeOnCola(1);
			}
			if (monitorRecursos.tiempoEnCola(2) > 0) {
				monitorRecursos.updateTimeOnCola(2);
			}

			sleepy(1);// dormimos un segundo
			// System.out.println(monitorRecursos.getApagar());

		}

	}

	// hora del sistema
	public static void infoHora(Date s) {

		content.remove(labels[1]);
		labels[1].setText(formateoFecha(s));
		content.add(labels[1]);
		// System.out.println("hora actualizada");
		frame.repaint();

	}

	// servicios pendientes
	public static void infoEnValla1(int p) {
		content.remove(labels[3]);
		labels[3].setText(Integer.toString(p));
		content.add(labels[3]);
		// System.out.println("hora actualizada");
		frame.repaint();

	}

	public static void infoEnColaValla1(int n) {

		content.remove(labels[5]);
		labels[5].setText(Integer.toString(n));
		content.add(labels[5]);
		// System.out.println("hora actualizada");
		frame.repaint();

	}

	// hora de finalizacion prevista
	public void infoTiempoColaV1(String n) {
		content.remove(labels[7]);
		// labels[5].setText(Integer.toString(n));
		labels[7].setText(n);
		content.add(labels[7]);
		// System.out.println("hora actualizada");
		frame.repaint();

	}

	// servicios pendientes
	public static void infoEnValla2(int n) {

		content.remove(labels[9]);
		labels[9].setText(Integer.toString(n));
		content.add(labels[9]);
		// System.out.println("hora actualizada");
		frame.repaint();

	}

	public static void infoEnColaValla2(int n) {

		content.remove(labels[11]);
		labels[11].setText(Integer.toString(n));
		content.add(labels[11]);
		// System.out.println("hora actualizada");
		frame.repaint();

	}

	/**
	 * Obtiene la hora de finalizacion prevista para la Valla2, para poder
	 * mostar el valor
	 * 
	 * @param hora
	 * 
	 */
	public static void infoTiempoColaV2(String hora) {

		content.remove(labels[13]);
		labels[13].setText(hora);
		content.add(labels[13]);
		// System.out.println("hora actualizada");
		frame.repaint();

	}

	/**
	 * Obtiene el numero de clientes que hay actulemente en el sistema, para
	 * poder mostar el valor
	 * 
	 * @param numClientes
	 * 
	 */

	public static void getClientes(int numClientes) {

		content.remove(labels[15]);
		labels[15].setText(Integer.toString(numClientes));
		content.add(labels[15]);
		// System.out.println("hora actualizada");
		frame.repaint();

	}

	/**
	 * añade segundos a las fecha que se le indique
	 * 
	 * @param Date
	 * @param segundos
	 * @return Date
	 * 
	 */
	public static Date anadirTiempo(Date fecha, int segundos) {

		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha); // Configuramos la fecha que se recibe
		calendar.add(Calendar.SECOND, segundos); // numero de minutos a añadir,
													// o restar en caso de
													// horas<0

		return calendar.getTime(); // Devuelve el objeto Date con las nuevas
									// horas añadidas

	}

	/**
	 * Devuelve la hora actual del sistema
	 * 
	 * 
	 * @return Date
	 * 
	 */
	public static Date getHoraActual() {
		Date ahora = new Date();
		// SimpleDateFormat formateador = new SimpleDateFormat("hh:mm:ss");
		return ahora;
	}

	/**
	 * Realiza formatemo de la fecha a hh:mm:ss
	 * 
	 * @param fecha
	 * @return fecha
	 * 
	 */
	public static String formateoFecha(Date fecha) {

		SimpleDateFormat formateador = new SimpleDateFormat("hh:mm:ss");
		return formateador.format(fecha);

	}

	/**
	 * Duerme el proceso durante el tiempo indicado en segundos
	 * 
	 * @param seconds
	 * 
	 */
	private static void sleepy(int seconds) {

		try {
			Thread.sleep(seconds * 1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

}
